// import { Model, Optional } from 'sequelize/types';
// import { swaggerClass, swaggerProperty } from 'koa-swagger-decorator';

// @swaggerClass()
// export default class User extends Model<
//   UserAttributes,
//   MyInfoCreationAttributes
// > {
//   @swaggerProperty({
//     type: 'number',
//     required: false,
//   })
//   @Comment('主键id')
//   @AllowNull(false)
//   @NotEmpty
//   @AutoIncrement
//   // @PrimaryKey
//   @Column({
//     type: DataType.INTEGER,
//   })
//   id?: number;

//   @swaggerProperty({
//     type: 'string',
//     required: false,
//   })
//   @PrimaryKey
//   @Comment('用户名')
//   @Column({
//     type: DataType.STRING,
//   })
//   nickname!: string;

//   @PrimaryKey
//   @swaggerProperty({
//     type: 'string',
//     required: false,
//   })
//   @Comment('密码')
//   // @Length({ max: 18, min: 6 })
//   @Column({
//     type: DataType.STRING,
//   })
//   password!: string;

//   @swaggerProperty({
//     type: 'string',
//     required: false,
//   })
//   @Column({
//     defaultValue: '',
//     comment: '用户手机号',
//   })
//   phone!: string;

//   @swaggerProperty({
//     type: 'string',
//     required: false,
//   })
//   @Column({
//     defaultValue: '',
//     comment: '用户邮箱',
//   })
//   email!: string;

//   @swaggerProperty({
//     type: 'object',
//     required: false,
//   })
//   @Default(new Date())
//   @CreatedAt
//   @Comment('创建时间')
//   @Column
//   createDate?: Date;

//   @swaggerProperty({
//     type: 'object',
//     required: false,
//   })
//   @Comment('更新时间')
//   @Default(new Date())
//   @UpdatedAt
//   @Column
//   updateDate?: Date;

//   @swaggerProperty({
//     type: 'object',
//     required: false,
//   })
//   @Comment('删除时间')
//   @Default(new Date())
//   @DeletedAt
//   @Column
//   deleteDate?: Date;
// }

// export interface UserAttributes {
//   id: number | undefined;
//   nickname: string;
//   password: string;
//   phone: string | undefined;
//   email: string | undefined;
//   createDate: Date | undefined;
//   updateDate: Date | undefined;
//   deleteDate: Date | undefined;
// }
// export interface MyInfoCreationAttributes
//   extends Optional<UserAttributes, 'id'> {}
import { swaggerClass, swaggerProperty } from 'koa-swagger-decorator';
import {
  CreationOptional,
  DataTypes,
  Model,
  ModelAttributes,
  ModelOptions,
} from 'sequelize';
@swaggerClass()
export default class User extends Model<ModelAttributes> {
  @swaggerProperty({
    type: 'number',
    required: false,
  })
  // id can be undefined during creation when using `autoIncrement`
  declare id: CreationOptional<number>;

  @swaggerProperty({
    type: 'string',
    required: false,
  })
  declare nickname: string;

  @swaggerProperty({
    type: 'string',
    required: false,
  })
  declare password: string;

  @swaggerProperty({
    type: 'string',
    required: false,
  })
  declare phone: string;

  @swaggerProperty({
    type: 'string',
    required: false,
  })
  declare email: string;

  @swaggerProperty({
    type: 'object',
    required: false,
  })
  declare createDate: CreationOptional<Date>;

  @swaggerProperty({
    type: 'object',
    required: false,
  })
  declare updateDate: CreationOptional<Date>;

  @swaggerProperty({
    type: 'object',
    required: false,
  })
  declare deleteDate: CreationOptional<Date>;

  @swaggerProperty({
    type: 'boolean',
    required: false,
  })
  declare loginStatus: CreationOptional<boolean>;

  @swaggerProperty({
    type: 'string',
    required: false,
  })
  declare ip: string;
}

export const Options: ModelOptions = {
  tableName: 'user',
};

export const Models: ModelAttributes = {
  id: {
    type: DataTypes.INTEGER.UNSIGNED,
    autoIncrement: true,
    primaryKey: true,
  },
  nickname: { type: DataTypes.STRING, allowNull: false },
  password: { type: DataTypes.STRING, allowNull: false },
  phone: { type: DataTypes.STRING, allowNull: true },
  email: { type: DataTypes.STRING, allowNull: true },
  createDate: { type: DataTypes.DATE, defaultValue: new Date() },
  updateDate: { type: DataTypes.DATE, defaultValue: new Date() },
  deleteDate: { type: DataTypes.DATE, defaultValue: new Date() },
  loginStatus: { type: DataTypes.BOOLEAN, defaultValue: false },
  ip: { type: DataTypes.STRING },
};
